<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="sGcYB" id="sGcYB"><span data-lake-id="uc1a87cea" id="uc1a87cea">典型回答</span></h1>
  <p data-lake-id="u284c0ea0" id="u284c0ea0"><br></p>
  <p data-lake-id="u9a6463ed" id="u9a6463ed"><span data-lake-id="u77de1792" id="u77de1792">&lt;? extends T&gt; 表示类型的上界，表示参数化类型的可能是T 或是 T的子类</span></p>
  <p data-lake-id="u62479cbe" id="u62479cbe"><span data-lake-id="u0a23a246" id="u0a23a246">​</span><br></p>
  <pre lang="java"><code>
// 定义一个泛型方法，接受任何继承自Number的类型
public &lt;T extends Number&gt; void processNumber(T number) {
    // 在这个方法中，可以安全地调用Number的方法
    double value = number.doubleValue();
    // 其他操作...
}
</code></pre>
  <p data-lake-id="u79dd039b" id="u79dd039b"><span data-lake-id="uf05d5c19" id="uf05d5c19">​</span><br></p>
  <p data-lake-id="u2d58f053" id="u2d58f053"><span data-lake-id="u93201eb6" id="u93201eb6">&lt;? super T&gt; 表示类型下界（Java Core中叫超类型限定），表示参数化类型是此类型的超类型（父类型），直至Object</span></p>
  <p data-lake-id="u7449a09c" id="u7449a09c"><span data-lake-id="u59d32422" id="u59d32422">​</span><br></p>
  <pre lang="java"><code>
// 定义一个泛型方法，接受任何类型的List，并向其中添加元素
public &lt;T&gt; void addElements(List&lt;? super T&gt; list, T element) {
    list.add(element);
    // 其他操作...
}
</code></pre>
  <p data-lake-id="ueb0252e8" id="ueb0252e8"><span data-lake-id="ub38ff3d2" id="ub38ff3d2">​</span><br></p>
  <p data-lake-id="u6ef1e9b6" id="u6ef1e9b6"><span data-lake-id="u7f9823c1" id="u7f9823c1">在使用 限定通配符的时候，需要遵守</span><strong><span data-lake-id="uf12f433d" id="uf12f433d">PECS原则</span></strong><span data-lake-id="u4072c2a9" id="u4072c2a9">，即</span><span data-lake-id="u2d4f04ca" id="u2d4f04ca" class="lake-fontsize-11" style="color: rgb(0, 0, 0)">Producer Extends, Consumer Super；上界生产，下界消费。</span></p>
  <p data-lake-id="u05d332de" id="u05d332de"><span data-lake-id="ue19966d4" id="ue19966d4" class="lake-fontsize-11" style="color: rgb(0, 0, 0)">​</span><br></p>
  <p data-lake-id="ua2317cfd" id="ua2317cfd"><span data-lake-id="u477a293f" id="u477a293f">如果要从集合中读取类型T的数据，并且不能写入，可以使用 ? extends 通配符；(Producer Extends)，如上面的processNumber方法。</span></p>
  <p data-lake-id="u0d8bd3e0" id="u0d8bd3e0"><span data-lake-id="u0b3fb686" id="u0b3fb686">如果要从集合中写入类型T的数据，并且不需要读取，可以使用 ? super 通配符；(Consumer Super)，如上面的addElements方法</span></p>
  <p data-lake-id="u68341cb2" id="u68341cb2"><span data-lake-id="ue3b60aad" id="ue3b60aad">​</span><br></p>
  <blockquote data-lake-id="uf9060913" id="uf9060913">
   <p data-lake-id="uaee38e63" id="uaee38e63"><span data-lake-id="uf66220ab" id="uf66220ab">extend的时候是可读取不可写入，那为什么叫上界生产呢？</span></p>
   <p data-lake-id="u38ddaf95" id="u38ddaf95"><span data-lake-id="u5f901f82" id="u5f901f82">因为这个消费者/生产者描述的&lt;集合&gt;，当我们从集合读取的时候，集合是生产者。</span></p>
  </blockquote>
  <p data-lake-id="ub3c197b4" id="ub3c197b4"><br></p>
  <p data-lake-id="uff5402a8" id="uff5402a8"><span data-lake-id="u03fcfbe9" id="u03fcfbe9">如果既要存又要取，那么就不要使用任何通配符。</span></p>
 </body>
</html>